package banksimulator.ui;

import banksimulator.bank.AbstractAccount;
import banksimulator.bank.AccountChangeEvent;
import banksimulator.bank.AccountChangeListener;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import javax.swing.table.AbstractTableModel;

/**
 * <p>这是一个TableModel的实现，它用来以表格的形式显示某个帐户的所有交易信息。
 * <p>使用这个模型只需要传入一个AbstractAccount子类的具体实例即可，当该帐户的进行了新的交易操作时，
 * 该模型会自动刷新显示的交易信息。
 * @author Rajab
 */
public class TransactionTableModel extends AbstractTableModel {
    /*    private Date commitTime;
    private String description;
    private String fromAccountID;
    private String toAccountID;
    private double amount;*/

    //要显示的帐户
    private AbstractAccount account;
    //帐户侦听器
    AccountChangeListener listener = new AccountChangeListener() {

        public void accountChanged(AccountChangeEvent evt) {
            //通过模型数据已经发生变化
            fireTableDataChanged();
            //System.out.printf("Table Model:%.2f, %.2f\n", evt.getBefore(), evt.getAfter());
        }
    };

    /**
     * 设置要显示的帐户。
     * @param account 要显示的帐户
     */
    public void setAccount(AbstractAccount account) {
        if (this.account != account) {
            if (this.account != null) {
                //移除上一个帐户的侦听器
                this.account.removeAccountChangeListener(listener);
            }
            if (account != null) {
                //注册新的侦听器
                account.addAccountChangeListener(listener);
            }
            this.account = account;
            //通过模型数据已经发生变化
            fireTableDataChanged();
        }
    }
    String[] columnNames = {"提交时间", "交易类型", "金额", "余额"};
    DecimalFormat fmt = new DecimalFormat("#,##0.00");
    SimpleDateFormat dfmt = new SimpleDateFormat("yyyy/MM/dd HH:mm");

    /**
     * 构造一个默认的TransactionTableModel。
     */
    public TransactionTableModel() {
        //this.columnNames = columnNames;
    }

    /**
     * 返回该模型中的行数。JTable 使用此方法来确定它应该显示多少行。
     * 此方法应该是快速执行的，因为在呈现期间会经常调用它。
     * @return 该模型中的行数
     */
    public int getRowCount() {
        if (account == null) {
            return 0;
        }
        return account.allTranscation().size();
    }

    /**
     * 返回该模型中的列数。JTable 使用此方法来确定在默认情况下它应该创建并显示多少列。
     * @return 该模型中的列数
     */
    public int getColumnCount() {
        return columnNames.length;
    }

    /**
     * 返回 columnIndex 和 rowIndex 位置的单元格值。
     * @param rowIndex 要查询的值所在行
     * @param columnIndex 要查询的值所在列
     * @return 指定单元格位置的值 Object
     */
    public Object getValueAt(int rowIndex, int columnIndex) {

        Object value = null;
        switch (columnIndex) {
            case 0:
                value = dfmt.format(account.allTranscation().get(rowIndex).getCommitTime());
                break;
            case 1:
                value = account.allTranscation().get(rowIndex).toString();
                break;
            case 2:
                String amount = fmt.format(account.allTranscation().get(rowIndex).getAmount());
                // value = Double.valueOf(fmtString);
                value = amount;
                break;
            case 3:
                String balance = fmt.format(account.allTranscation().get(rowIndex).getBalance());
                // value = Double.valueOf(fmtString);
                value = balance;
                break;
            default:
                value = "";
                break;
        }
        return value;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
//        Class c = null;
//        switch (columnIndex) {
//            case 0:
//            case 1:
//                c = String.class;
//                break;
//            case 2:
//                c = Double.class;
//                break;
//        }
//        return c;
        return String.class;
    }

    /**
     * 返回 columnIndex 位置的列的名称。这用于初始化该表的列头名。
     * <br><b>注：</b>此名称不必是惟一的；表中的两列可以具有相同的名称。
     * @param column 列的索引
     * @return 列的名称
     */
    @Override
    public String getColumnName(int column) {
        return columnNames[column];

    }
}
